home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / Wipeout / source / timer.c < prev    next >
C/C++ Source or Header  |  1998-04-12  |  2KB  |  119 lines

  1. /*
  2.  * $Id: timer.c 1.3 1998/04/12 17:30:13 olsen Exp olsen $
  3.  *
  4.  * :ts=4
  5.  *
  6.  * Wipeout -- Traces and munges memory and detects memory trashing
  7.  *
  8.  * Written by Olaf `Olsen' Barthel <olsen@sourcery.han.de>
  9.  * Public Domain
  10.  */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "global.h"
  14. #endif    /* _GLOBAL_H */
  15.  
  16. /******************************************************************************/
  17.  
  18. #define BUSY (0)
  19.  
  20. /******************************************************************************/
  21.  
  22. STATIC struct MsgPort *        TimerPort;
  23. STATIC struct timerequest *    TimerRequest;
  24. STATIC BOOL                    TimerTicking;
  25.  
  26. /******************************************************************************/
  27.  
  28. VOID
  29. StopTimer(VOID)
  30. {
  31.     /* stop a ticking timer */
  32.     if(TimerTicking)
  33.     {
  34.         if(CheckIO((struct IORequest *)TimerRequest) == BUSY)
  35.             AbortIO((struct IORequest *)TimerRequest);
  36.  
  37.         WaitIO((struct IORequest *)TimerRequest);
  38.         TimerTicking = FALSE;
  39.     }
  40. }
  41.  
  42. /******************************************************************************/
  43.  
  44. VOID
  45. StartTimer(ULONG seconds,ULONG micros)
  46. {
  47.     /* restart the timer */
  48.  
  49.     StopTimer();
  50.  
  51.     if(seconds > 0 || micros > 0)
  52.     {
  53.         TimerRequest->tr_node.io_Command    = TR_ADDREQUEST;
  54.         TimerRequest->tr_time.tv_secs        = seconds;
  55.         TimerRequest->tr_time.tv_micro        = micros;
  56.  
  57.         SetSignal(0,PORT_MASK(TimerPort));
  58.         SendIO((struct IORequest *)TimerRequest);
  59.  
  60.         TimerTicking = TRUE;
  61.     }
  62. }
  63.  
  64. /******************************************************************************/
  65.  
  66. VOID
  67. DeleteTimer(VOID)
  68. {
  69.     /* clean up all timer resources */
  70.  
  71.     StopTimer();
  72.  
  73.     if(TimerRequest != NULL)
  74.     {
  75.         if(TimerRequest->tr_node.io_Device != NULL)
  76.             CloseDevice((struct IORequest *)TimerRequest);
  77.  
  78.         DeleteIORequest((struct IORequest *)TimerRequest);
  79.         TimerRequest = NULL;
  80.     }
  81.  
  82.     if(TimerPort != NULL)
  83.     {
  84.         DeleteMsgPort(TimerPort);
  85.         TimerPort = NULL;
  86.     }
  87. }
  88.  
  89. BYTE
  90. CreateTimer(VOID)
  91. {
  92.     BYTE result = -1;
  93.  
  94.     /* allocate all timer resources */
  95.  
  96.     TimerPort = CreateMsgPort();
  97.     if(TimerPort != NULL)
  98.     {
  99.         TimerRequest = (struct timerequest *)CreateIORequest(TimerPort,sizeof(*TimerRequest));
  100.         if(TimerRequest != NULL)
  101.         {
  102.             if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)TimerRequest,0) == OK)
  103.             {
  104.                 /* required for GetSysTime() */
  105.                 TimerBase = TimerRequest->tr_node.io_Device;
  106.  
  107.                 result = TimerPort->mp_SigBit;
  108.             }
  109.         }
  110.     }
  111.  
  112.     if(result == -1)
  113.     {
  114.         DeleteTimer();
  115.     }
  116.  
  117.     return(result);
  118. }
  119.